#include <i386/interrupt.h>
#include <i386/thread.h>
#include <xbook/thread.h>

/**
 * kernel_thread - 执行内核线程
 * @function: 要执行的线程
 * @arg: 参数
 * 
 * 改变当前的执行流，去执行我们选择的内核线程
 */
static void kernel_thread(thread_func_t *function, void *arg)
{
    enable_intr();  /* 在启动前需要打开中断，避免启动后不能产生时钟中断调度 */
    function(arg);
}

/**
 * thread_make_stack - 创建一个线程的执行环境
 * @thread: 线程结构体
 * @function: 要去执行的函数
 * @arg: 参数
 */
void thread_make_stack(thread_t *thread, thread_func_t *function, void *arg)
{
    /* 预留中断栈 */
    thread->kstack -= sizeof(trap_frame_t);
    /* 预留线程栈 */
    thread->kstack -= sizeof(thread_stack_t);
    thread_stack_t *thread_stack = (thread_stack_t *)thread->kstack;

    /* 填写线程栈信息 */
    // 在kernel_thread中去改变执行流，从而可以传递一个参数
    thread_stack->eip = kernel_thread;
    thread_stack->function = function;
    thread_stack->arg = arg;
    thread_stack->ebp = thread_stack->ebx = \
    thread_stack->esi = thread_stack->edi = 0;

}
